<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* Person信息 无对象 */
      function demo1() {
        let name = "张三丰";
        let age = 60;
        function fight() {
          console.log(`${name}又在打架了`);
        }

        fight();
      }
      // demo1()

      /* Person信息 对象版 */
      function demo2() {
        const obj = {
          name: "张三丰",
          age: 60,
          fight: function () {
            console.log(`${obj.age}岁的${obj.name}又在干架了`);
          },
        };
        obj.fight();
      }
      // demo2()

      /* Person信息 工厂函数版 */
      function demo3() {
        // 创装创建打手对象的工厂方法
        // 姓名年龄进去 打手对象出来
        function createPerson(name, age) {
          /* 专业化地创建打手对象 */
          const obj = {};
          obj.name = name;
          obj.age = age;
          obj.fight = function () {
            console.log(`${obj.age}岁的${obj.name}又在干架了`);
          };

          // 将造好的对象丢还调用者
          return obj;
        }

        // 定制一批打手
        const zsf = createPerson("张三丰", 60);
        const zwj = createPerson("张无忌", 20);

        zsf.fight();
        zwj.fight();
      }
      // demo3()

      /* Person信息 构造函数版 */
      /* 
      构造函数（类）：类只是一个概念（相当于造人的说明书）
      通过new 关键词去调用的函数 new Person()
      构造函数返回（该类）一个实例对象 灭绝师太（实实在在的人的【实例】）
      构造函数中的this指代正在构建的实例对象 该实例无需返回 系统默认替你返回
      构造函数命名规范：大驼峰（首字母大写的驼峰命名 DingjiGaoshou）
      */
      function demo4() {
        function Person(name, age) {
          // 将来要返回一个Person实例对象
          // 构造函数中的this即该对象
          // const person = {};

          // this就是你正在构造的对象
          // 正在构建灭绝师太 this就是构建中的灭绝师太
          this.name = name;
          this.age = age;

          this.fight = function () {
            // 调用fight的主语 mjst
            console.log(`${this.age}岁的${this.name}又在干架了`);
          };

          // 无需返回this 构造函数默认返回这个this
          // return this
        }

        const mjst = new Person("灭绝师太", 60);
        mjst.fight();

        const tstl = new Person("天山童姥", 80);
        tstl.fight();
      }
      demo4();
    </script>
  </body>
</html>
